package com.x.Part6_内部类;

/**
 * ClassName: OutClass
 * Package: IntelliJ IDEA
 * Description:
 * Written by HanXu
 * Create 2024.03.07 1:55
 */
public class OutClassTest {
    public static void main(String[] args) {

        //1、创建Person类中静态成员内部类的实例对象
        Person.Dog dog = new Person.Dog();
        dog.eat();


        System.out.println(".............");


        //2、创建Person类中非静态成员内部类的实例对象
        Person p1 = new Person();
        //用外部类的对象new非静态内部类的对象
        Person.Bird bird = p1.new Bird();

        //3、如何用内部类实例对象调用外部类的相关结构
        bird.fly();
        System.out.println(".............");
        bird.showName("黄鹂鸟");
        System.out.println(".............");
        bird.showEatMethod();




    }
}


//Person 外部类
class Person{

    String name = "hx";
    int age = 1;

    //静态的成员内部类(用类名调用)
    static class Dog{

        public void eat(){
            System.out.println("吃骨头");
        }

    }

    //非静态的成员内部类(用实例对象调用)
    class Bird{

        String name = "啄木鸟";
        public void fly(){
            System.out.println("鸟飞翔");
        }

        public void showAge(){
            System.out.println(age);//在非静态内部类中，可以调用外部类的属性
        }

        public void showName(String name){
            System.out.println(name);//传入的局部变量值
            System.out.println(this.name);//在非静态内部类中，直接写属性，是内部类的属性
            System.out.println(Person.this.name);//在非静态内部类中，若想调用外部类的属性，要写"外部类.this.属性"
        }

        //Bird中的eat方法
        public void eat(){
            System.out.println("鸟吃虫");
        }
        public void showEatMethod(){
            eat();//Bird中的eat方法
            Person.this.eat();//Person中的eat方法
        }

    }

    //Person中的eat方法
    public void eat(){
        System.out.println("人吃饭");
    }

    public void method(){

        //局部内部类（在方法中）
        class InnerClass{

        }
    }


    public Person(){
        //局部内部类（在构造器中）
        class InnerClass{

        }
    }

    {
        //局部内部类（在代码块中）
        class InnerClass{

        }
    }

}
